home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / kernel / dev / ds5000.md / devTtyAttach.c < prev    next >
C/C++ Source or Header  |  1992-12-18  |  6KB  |  247 lines

  1. /* 
  2.  * devTtyAttach.c --
  3.  *
  4.  *    This file manages the configuration of Z8530 chips on Sun-3
  5.  *    and Sun-4 workstations, and provides glue to attach the device
  6.  *    drivers for those chips to standard Sprite devices like
  7.  *    /dev/console and /dev/serialA.
  8.  *
  9.  * Copyright 1989 Regents of the University of California
  10.  * Permission to use, copy, modify, and distribute this
  11.  * software and its documentation for any purpose and without
  12.  * fee is hereby granted, provided that the above copyright
  13.  * notice appear in all copies.  The University of California
  14.  * makes no representations about the suitability of this
  15.  * software for any purpose.  It is provided "as is" without
  16.  * express or implied warranty.
  17.  */
  18.  
  19. #ifndef lint
  20. static char rcsid[] = "$Header: /cdrom/src/kernel/Cvsroot/kernel/dev/ds5000.md/devTtyAttach.c,v 9.0 89/09/12 15:02:14 douglis Stable $ SPRITE (Berkeley)";
  21. #endif /* not lint */
  22.  
  23. #include "sprite.h"
  24. #include "console.h"
  25. #include "mach.h"
  26. #include "tty.h"
  27. #include "dc7085.h"
  28.  
  29. /*
  30.  * Forward references to procedures declared in this file:
  31.  */
  32.  
  33. static int    NullOutputChar();
  34. static int    TtyInterrupt();
  35.  
  36. /*
  37.  * Pre-initialized data structures for three of the four channels in
  38.  * the dc7085.h chip.
  39.  */
  40.  
  41. static DevTty ttys[3];
  42.  
  43. DevDC7085 devKeyboard = {
  44.     "keyboard",                    /* name */
  45.     &ttys[0],                    /* ttyPtr */
  46.     4800,                    /* baud */
  47.     DevTtyInputChar,                /* inputProc */
  48.     (ClientData) &ttys[0],            /* inputData */
  49.     NullOutputChar,                /* outputProc */
  50.     (ClientData) &ttys[0],            /* outputData */
  51.     KBD_PORT,                /* This is the keyboard. */
  52.     0,
  53. };
  54.  
  55. DevDC7085 devSerialA = {
  56.     "serialA",                    /* name */
  57.     &ttys[1],                    /* ttyPtr */
  58.     9600,                    /* baud */
  59.     DevTtyInputChar,                /* inputProc */
  60.     (ClientData) &ttys[1],            /* inputData */
  61.     DevTtyOutputChar,                /* outputProc */
  62.     (ClientData) &ttys[1],            /* outputData */
  63.     MODEM_PORT,                /* This is the modem line
  64.                          * (or serial A). */
  65.     0,
  66. };
  67.  
  68. DevDC7085 devSerialB = {
  69.     "serialB",                    /* name */
  70.     &ttys[2],                    /* ttyPtr */
  71.     9600,                    /* baud */
  72.     DevTtyInputChar,                /* inputProc */
  73.     (ClientData) &ttys[2],            /* inputData */
  74.     DevTtyOutputChar,                /* outputProc */
  75.     (ClientData) &ttys[2],            /* outputData */
  76.     PRINTER_PORT,                /* This is the printer line
  77.                          * (or serial B). */
  78.     0,
  79. };
  80.  
  81. /*
  82.  * The following variable is filled in with the unit that should
  83.  * be used whenever "/dev/console" is opened (may be a serial unit
  84.  * if the machine doesn't have a keyboard+display).
  85.  */
  86. static int consoleUnit = 0;
  87.  
  88.  
  89. /*
  90.  *----------------------------------------------------------------------
  91.  *
  92.  * DevTtyInit --
  93.  *
  94.  *    Called during bootstrapping to initialize terminal-related
  95.  *    things.
  96.  *
  97.  * Results:
  98.  *    None.
  99.  *
  100.  * Side effects:
  101.  *    Resets serial devices and performs other initialization.
  102.  *
  103.  *----------------------------------------------------------------------
  104.  */
  105.  
  106. void
  107. DevTtyInit()
  108. {
  109.     consoleUnit = 0;
  110.  
  111.     /*
  112.      * Reset the devices.
  113.      */
  114.     DevDC7085Reset();
  115.  
  116.     DevDC7085RawProc(&devKeyboard, TD_RAW_SHUTDOWN, 0, (char *) NULL,
  117.              0, (char *) NULL);
  118.     DevDC7085RawProc(&devSerialA, TD_RAW_SHUTDOWN, 0, (char *) NULL,
  119.              0, (char *) NULL);
  120.     DevDC7085RawProc(&devSerialB, TD_RAW_SHUTDOWN, 0, (char *) NULL,
  121.              0, (char *) NULL);
  122. }
  123.  
  124.  
  125. /*
  126.  *----------------------------------------------------------------------
  127.  *
  128.  * DevTtyAttach --
  129.  *
  130.  *    Given a unit number, return the DevTty for the unit, properly
  131.  *    initialized.  This procedure is called as part of the open
  132.  *    sequence for a terminal.
  133.  *
  134.  * Results:
  135.  *    The return value is a pointer to a DevTty for the given unit,
  136.  *    with some of its fields filled in (see devTty.h for details).
  137.  *    If the unit number is bad, then NULL is returned.
  138.  *
  139.  * Side effects:
  140.  *    Device-specific data structures get initialized.
  141.  *
  142.  *----------------------------------------------------------------------
  143.  */
  144.  
  145. DevTty *
  146. DevTtyAttach(unit)
  147.     int unit;            /* Unit number for device. */
  148. {
  149.     register DevTty *ttyPtr;
  150.  
  151.     if ((unit > 2) || (unit < 0)) {
  152.     return NULL;
  153.     }
  154.  
  155.     /*
  156.      * If the console is one of the serial units, then disallow the
  157.      * serial unit for any use other than console.  Otherwise the
  158.      * wait tokens will get confused (two different wait tokens from
  159.      * higher-level software, but only one stored in the tty structure).
  160.      */
  161.  
  162.     if ((unit != 0) && (unit == consoleUnit)) {
  163.     return NULL;
  164.     }
  165.     
  166.     if (unit == 0) {
  167.     unit = consoleUnit;
  168.     }
  169.     ttyPtr = &ttys[unit];
  170.  
  171.     /*
  172.      * If the terminal is already open then there's nothing more to
  173.      * do;  otherwise, initialize the information relating to the
  174.      * unit.
  175.      */
  176.  
  177.     if (ttyPtr->openCount > 0) {
  178.     return ttyPtr;
  179.     }
  180.     ttyPtr->rawProc = DevDC7085RawProc;
  181.     ttyPtr->activateProc = DevDC7085Activate;
  182.     ttyPtr->inputProc = (void (*)()) NIL;
  183.     ttyPtr->inputData = (ClientData) 0;
  184.     if (unit == consoleUnit) {
  185.     ttyPtr->consoleFlags = DEV_TTY_IS_CONSOLE;
  186.     } else {
  187.     ttyPtr->consoleFlags = 0;
  188.     }
  189.  
  190.     switch (unit) {
  191.  
  192.     /*
  193.      * Unit 0 is the display+keyboard, which serves as console
  194.      * if it exists.
  195.      */
  196.  
  197.     case 0:
  198.         ttyPtr->rawProc = DevConsoleRawProc;
  199.         ttyPtr->rawData = (ClientData) &devKeyboard;
  200.         break;
  201.  
  202.     /*
  203.      * Unit 1 is serialA.
  204.      */
  205.  
  206.     case 1:
  207.         ttyPtr->rawData = (ClientData) &devSerialA;
  208.         break;
  209.  
  210.     /*
  211.      * Unit 2 is serialB.
  212.      */
  213.  
  214.     case 2:
  215.         ttyPtr->rawData = (ClientData) &devSerialB;
  216.         break;
  217.     }
  218.     return ttyPtr;
  219. }
  220.  
  221.  
  222. /*
  223.  *----------------------------------------------------------------------
  224.  *
  225.  * NullOutputChar --
  226.  *
  227.  *    This procedure is entered as the outputProc field of
  228.  *    DevDC7085 structures when the device is not used for
  229.  *    output.
  230.  *
  231.  * Results:
  232.  *    Always returns -1, which means "no output characters available".
  233.  *
  234.  * Side effects:
  235.  *    None.
  236.  *
  237.  *----------------------------------------------------------------------
  238.  */
  239.  
  240. /* ARGSUSED */
  241. static int
  242. NullOutputChar(clientData)
  243.     ClientData clientData;        /* Not used. */
  244. {
  245.     return -1;
  246. }
  247.